package filter

import (
	"fmt"
	"github.com/beego/beego/v2/server/web/context"
	R "ksd-social-api/commons/result"
	"ksd-social-api/modules/login/model/dto"
	"ksd-social-api/utils"
	"ksd-social-api/utils/rdb"
	"strconv"
	"strings"
)

// 给那些不需要登录的接口在登录的状态获取用户信息---TokenFilter--没有/v1
// 而那些需要登录接口在登录状态获取用户----LoginFilter 有/v1
func TokenFilter(ctx *context.Context) {
	isUrlExist := ValidateURL(ctx.Request.URL.Path)
	if !isUrlExist {
		// 如果是登录接口，/api/v1/xxx就直接进入loginfilter去校验。
		contains := strings.Contains(ctx.Request.RequestURI, "v1")
		// 如果接口中包括的是v1就直接反行，去执行loginfilter
		if !contains {
			// 如果在登录的情况，获取登录的token
			Token := ctx.Request.Header["Authorization"]
			// 如果你确实在前端登录了len(Token) 。并且len(Token[0])也不是""
			if len(Token) > 0 && len(Token[0]) > 0 {
				userLoginUuid := Token[0]
				// 如果用户还在登录中就开始使用UUID到缓存中获取用户信息
				cacheLoginKey := fmt.Sprintf("LOGIN:USER:%s", userLoginUuid)
				cacheUser, _ := rdb.RdbHGet(cacheLoginKey, "user")
				if cacheUser != nil {
					userDto := dto.UserDto{}
					utils.JsonToStruct(cacheUser.(string), &userDto)
					SystemIdArr := ctx.Request.Header["Systemid"]
					systemId, _ := strconv.ParseUint(SystemIdArr[0], 10, 64)
					platformSystemVo := systemService.GetPlatformSystemService(systemId)
					// 如果用户不为空，但是被拉黑了直接
					user := userService.IsForbiddenUser(userDto.Id, systemId)
					if user == nil {
						// 如果过期了就直接返回，token失效
						ctx.Output.JSON(R.FailCodeMsg(80001, "账号已被禁止!"), true, false)
						return
					}
					// 如果没有。就获取用户信息，下放到路由处理方法中，这样给后续需要用户信息的地方可以直接获取
					ctx.Input.SetData("uuid", userLoginUuid)
					ctx.Input.SetData("userId", userDto.Id)
					ctx.Input.SetData("username", userDto.Username)
					ctx.Input.SetData("avatar", userDto.Avatar)
					ctx.Input.SetData("phone", userDto.Telephone)
					ctx.Input.SetData("nickname", userDto.Nickname)
					ctx.Input.SetData("address", userDto.Address)
					ctx.Input.SetData("systemId", SystemIdArr[0])
					ctx.Input.SetData("vipType", user.VipFlag)
					ctx.Input.SetData("systemName", platformSystemVo.Sysname)
					// 实时监听用户是否过期
					userVipService.UserVipSettingPeriod(userDto.Id, systemId)
				}
			}
		}
	}
}
